/* 
 * RelatorioController.java
 * Copyright (c) Faculdade Anhanguera de Anápolis.
 * Tecnologia em Análise e Desenvolvimento de Sistemas.
 * Projeto Multidisciplinar de Autoaprendizagem.
 *
 * Este software é confidencial e propriedade da Faculdade Anhanguera de Anápolis.
 * Não é permitida sua distribuição ou divulgação do seu conteúdo sem expressa autorização da Faculdade Anhanguera de Anápolis.
 * Este arquivo contém informações proprietárias.
 */
package br.com.pma.chamatec.controller;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.inject.Inject;

import net.sf.jasperreports.engine.JRException;
import br.com.pma.chamatec.business.IChamadoBO;
import br.com.pma.chamatec.dominio.ContentTypeArquivo;
import br.com.pma.chamatec.exception.ChamatecNegocioException;
import br.com.pma.chamatec.vo.AtributosRelatorioVO;
import br.com.pma.chamatec.vo.ChamadoVO;
import br.com.pma.entity.Chamado;

/**
 * Controlador para o Caso de Uso Gerar Relatório.
 *
 * @author Ludemeula Fernandes de Sá
 */
@ManagedBean
@ViewScoped
public class RelatorioController extends AbstractController {
	private static final long serialVersionUID = -1697615866054751018L;
	private static final String NOME_RELATORIO = "relatorio_chamado";
	private static final String CAMINHO_JASPER = "/relatorios/relatorio_chamado.jasper";

	@Inject
	private IChamadoBO chamadoBO;

	@Inject
	private Chamado chamado;

	@Inject
	private Chamado chamadoSearch;

	private List<Chamado> chamados;

	private Date dataInicial = new Date();
	private Date dataFinal = new Date();

	/**
	 * @see br.com.pma.chamatec.controller.AbstractController#init()
	 */
	@Override
	@PostConstruct
	public void init() {
		super.init();
	}

	public String cancelar() {
		chamados = new ArrayList<Chamado>();
		return "index";
	}

	/**
	 * Limpa os campos de pesquisa e a datatable.
	 * 
	 */
	public void limpar() {
		chamados = null;
		chamadoSearch = new Chamado();
	}

	/**
	 * Retorna os dados da entidade Chamado.
	 * 
	 */
	public void pesquisar() {
		try {
			chamados = null;
			chamados = chamadoBO.gerar(chamadoSearch, getDataInicial(), getDataFinal());
		} catch (ChamatecNegocioException e) {
			addFacesMessage(e.getMessage(), FacesMessage.SEVERITY_ERROR);
		} catch (Exception e) {
			montaMensagemGenerica(e);
		}
	}

	/**
	 * Imprime os dados de Chamado.
	 * 
	 */
	public void imprimir() {
		try {
			AtributosRelatorioVO atributosRelatorio = new AtributosRelatorioVO();
			prepararAtributosParaImpressao(atributosRelatorio, ContentTypeArquivo.PDF);
			gerarRelatorio(facesContext, atributosRelatorio, ContentTypeArquivo.PDF);
		} catch (IOException e) {
			addFacesMessage(e.getMessage(), FacesMessage.SEVERITY_ERROR);
		} catch (JRException e) {
			addFacesMessage(e.getMessage(), FacesMessage.SEVERITY_ERROR);
		} catch (Exception e) {
			montaMensagemGenerica(e);
		}
	}

	/**
	 * Adiciona os parâmetros para a impressão do relatório.
	 * 
	 * @param atributosRelatorio
	 * @param contentType
	 */
	public void prepararAtributosParaImpressao(AtributosRelatorioVO atributosRelatorio, ContentTypeArquivo contentType) {
		try {
			List<ChamadoVO> dados = new ArrayList<ChamadoVO>();
			
			for (Chamado chamado : chamados) {
				ChamadoVO chamadoVO = new ChamadoVO(chamado);
				dados.add(chamadoVO);
			}

			Map<String, Object> params = new HashMap<String, Object>();
			params.put("colecaoGrafico", dados);
			params.put("SUBREPORT_DIR", super.recuperarPathAplicacao().concat("/WEB-INF/classes/relatorios/"));
			atributosRelatorio.setColecao(dados);
			atributosRelatorio.setCompilar(Boolean.FALSE);
			atributosRelatorio.setModoDownload(Boolean.TRUE);
			atributosRelatorio.setNomeArquivoGeracao(NOME_RELATORIO);
			if (contentType.equals(ContentTypeArquivo.PDF)) {
				atributosRelatorio.setNomeArquivoJasper(CAMINHO_JASPER);
			}
			atributosRelatorio.setParams(params);
		} catch (Exception e) {
			montaMensagemGenerica(e);
		}
	}

	/********************************************* Getters e Setters *****************************************************/
	/**
	 * @return the chamado
	 */
	public Chamado getChamado() {
		return chamado;
	}

	/**
	 * @param chamado the chamado to set
	 */
	public void setChamado(Chamado chamado) {
		this.chamado = chamado;
	}

	/**
	 * @return the chamadoSearch
	 */
	public Chamado getChamadoSearch() {
		return chamadoSearch;
	}

	/**
	 * @param chamadoSearch the chamadoSearch to set
	 */
	public void setChamadoSearch(Chamado chamadoSearch) {
		this.chamadoSearch = chamadoSearch;
	}

	/**
	 * @return the chamados
	 */
	public List<Chamado> getChamados() {
		return chamados;
	}

	/**
	 * @param chamados the chamados to set
	 */
	public void setChamados(List<Chamado> chamados) {
		this.chamados = chamados;
	}

	/**
	 * @return the dataInicial
	 */
	public Date getDataInicial() {
		return dataInicial;
	}

	/**
	 * @param dataInicial the dataInicial to set
	 */
	public void setDataInicial(Date dataInicial) {
		this.dataInicial = dataInicial;
	}

	/**
	 * @return the dataFinal
	 */
	public Date getDataFinal() {
		return dataFinal;
	}

	/**
	 * @param dataFinal the dataFinal to set
	 */
	public void setDataFinal(Date dataFinal) {
		this.dataFinal = dataFinal;
	}
}